/*!
 * \file WtBtPorter.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader回测Porter接口头文件
 * 
 * \details 该文件定义了WonderTrader回测系统的C语言Porter接口：
 *          - 提供C语言兼容的API接口，支持多语言调用
 *          - 支持CTA、SEL、HFT三种策略类型的完整回测接口
 *          - 支持策略上下文管理和生命周期控制
 *          - 支持历史数据回放和外部数据源加载
 *          - 支持回测执行控制和结果输出
 *          - 支持事件回调和异步处理机制
 *          - 支持日志记录和用户数据存储
 *          
 *          主要功能模块：
 *          - 回测系统初始化和配置管理
 *          - 策略模拟器创建和管理
 *          - CTA策略接口：趋势跟踪策略回测
 *          - SEL策略接口：选股策略回测
 *          - HFT策略接口：高频交易策略回测
 *          - 外部数据加载器接口
 *          - 历史数据推送接口
 *          - 回测执行控制接口
 */
#pragma once
#include "PorterDefs.h"


#ifdef __cplusplus
extern "C"
{
#endif
	/**
	 * @brief 注册事件回调函数
	 * @details 注册回测系统事件回调函数，用于接收系统事件通知
	 * @param cbEvt 事件回调函数指针
	 */
	EXPORT_FLAG	void		register_evt_callback(FuncEventCallback cbEvt);

	/**
	 * @brief 注册CTA策略回调函数
	 * @details 注册CTA策略的各种回调函数，包括初始化、tick、计算、K线、会话事件等
	 * @param cbInit 策略初始化回调函数
	 * @param cbTick tick数据回调函数
	 * @param cbCalc 策略计算回调函数
	 * @param cbBar K线数据回调函数
	 * @param cbSessEvt 会话事件回调函数
	 * @param cbCalcDone 计算完成回调函数（可选）
	 */
	EXPORT_FLAG	void		register_cta_callbacks(FuncStraInitCallback cbInit, FuncStraTickCallback cbTick, FuncStraCalcCallback cbCalc, 
		FuncStraBarCallback cbBar, FuncSessionEvtCallback cbSessEvt, FuncStraCalcCallback cbCalcDone);

	/**
	 * @brief 注册SEL策略回调函数
	 * @details 注册选股策略的各种回调函数，包括初始化、tick、计算、K线、会话事件等
	 * @param cbInit 策略初始化回调函数
	 * @param cbTick tick数据回调函数
	 * @param cbCalc 策略计算回调函数
	 * @param cbBar K线数据回调函数
	 * @param cbSessEvt 会话事件回调函数
	 * @param cbCalcDone 计算完成回调函数（可选）
	 */
	EXPORT_FLAG	void		register_sel_callbacks(FuncStraInitCallback cbInit, FuncStraTickCallback cbTick, FuncStraCalcCallback cbCalc, 
		FuncStraBarCallback cbBar, FuncSessionEvtCallback cbSessEvt, FuncStraCalcCallback cbCalcDone);

	/**
	 * @brief 注册HFT策略回调函数
	 * @details 注册高频交易策略的各种回调函数，包括初始化、tick、K线、通道、订单、成交等
	 * @param cbInit 策略初始化回调函数
	 * @param cbTick tick数据回调函数
	 * @param cbBar K线数据回调函数
	 * @param cbChnl 通道事件回调函数
	 * @param cbOrd 订单回调函数
	 * @param cbTrd 成交回调函数
	 * @param cbEntrust 委托回调函数
	 * @param cbOrdDtl 订单明细回调函数
	 * @param cbOrdQue 订单队列回调函数
	 * @param cbTrans 逐笔成交回调函数
	 * @param cbSessEvt 会话事件回调函数
	 */
	EXPORT_FLAG	void		register_hft_callbacks(FuncStraInitCallback cbInit, FuncStraTickCallback cbTick, FuncStraBarCallback cbBar,
		FuncHftChannelCallback cbChnl, FuncHftOrdCallback cbOrd, FuncHftTrdCallback cbTrd, FuncHftEntrustCallback cbEntrust,
		FuncStraOrdDtlCallback cbOrdDtl, FuncStraOrdQueCallback cbOrdQue, FuncStraTransCallback cbTrans, FuncSessionEvtCallback cbSessEvt);

	/**
	 * @brief 注册外部数据加载器
	 * @details 注册外部数据加载器，支持自定义数据源加载K线、tick、复权因子等数据
	 * @param fnlBarLoader 最终K线数据加载器
	 * @param rawBarLoader 原始K线数据加载器
	 * @param fctLoader 复权因子加载器
	 * @param tickLoader tick数据加载器
	 * @param bAutoTrans 是否自动转换数据格式
	 */
	EXPORT_FLAG void		register_ext_data_loader(FuncLoadFnlBars fnlBarLoader, FuncLoadRawBars rawBarLoader, FuncLoadAdjFactors fctLoader, FuncLoadRawTicks tickLoader, bool bAutoTrans);

	/**
	 * @brief 推送原始K线数据
	 * @details 向回测系统推送原始K线数据
	 * @param bars K线数据数组指针
	 * @param count K线数据条数
	 */
	EXPORT_FLAG void		feed_raw_bars(WTSBarStruct* bars, WtUInt32 count);

	/**
	 * @brief 推送原始tick数据
	 * @details 向回测系统推送原始tick数据
	 * @param ticks tick数据数组指针
	 * @param count tick数据条数
	 */
	EXPORT_FLAG void		feed_raw_ticks(WTSTickStruct* ticks, WtUInt32 count);

	/**
	 * @brief 推送复权因子数据
	 * @details 向回测系统推送指定合约的复权因子数据
	 * @param stdCode 标准合约代码
	 * @param dates 日期数组
	 * @param factors 复权因子数组
	 * @param count 数据条数
	 */
	EXPORT_FLAG void		feed_adj_factors(WtString stdCode, WtUInt32* dates, double* factors, WtUInt32 count);

	/**
	 * @brief 初始化回测系统
	 * @details 初始化回测系统，设置日志配置和输出目录
	 * @param logProfile 日志配置文件路径或内容
	 * @param isFile 是否为文件路径（true）或配置内容（false）
	 * @param outDir 输出目录路径
	 */
	EXPORT_FLAG	void		init_backtest(const char* logProfile, bool isFile, const char* outDir);

	/**
	 * @brief 配置回测系统
	 * @details 配置回测系统参数，加载配置文件
	 * @param cfgfile 配置文件路径或内容
	 * @param isFile 是否为文件路径（true）或配置内容（false）
	 */
	EXPORT_FLAG	void		config_backtest(const char* cfgfile, bool isFile);

	/**
	 * @brief 设置回测时间范围
	 * @details 设置回测的开始时间和结束时间
	 * @param stime 开始时间（时间戳格式）
	 * @param etime 结束时间（时间戳格式）
	 */
	EXPORT_FLAG	void		set_time_range(WtUInt64 stime, WtUInt64 etime);

	/**
	 * @brief 启用tick级别回测
	 * @details 启用或禁用tick级别的回测模式
	 * @param bEnabled 是否启用tick级别回测
	 */
	EXPORT_FLAG	void		enable_tick(bool bEnabled = true);

	/**
	 * @brief 初始化CTA策略模拟器
	 * @details 创建并初始化CTA策略模拟器实例
	 * @param name 策略名称
	 * @param slippage 滑点设置（默认为0）
	 * @param hook 是否启用钩子（默认为false）
	 * @param persistData 是否持久化数据（默认为true）
	 * @return CtxHandler 策略上下文句柄
	 */
	EXPORT_FLAG	CtxHandler	init_cta_mocker(const char* name, int slippage = 0, bool hook = false, bool persistData = true);

	/**
	 * @brief 初始化HFT策略模拟器
	 * @details 创建并初始化高频交易策略模拟器实例
	 * @param name 策略名称
	 * @param hook 是否启用钩子（默认为false）
	 * @return CtxHandler 策略上下文句柄
	 */
	EXPORT_FLAG	CtxHandler	init_hft_mocker(const char* name, bool hook = false);

	/**
	 * @brief 初始化SEL策略模拟器
	 * @details 创建并初始化选股策略模拟器实例
	 * @param name 策略名称
	 * @param date 基准日期
	 * @param time 基准时间
	 * @param period 调仓周期
	 * @param trdtpl 交易日模板（默认为"CHINA"）
	 * @param session 交易时段（默认为"TRADING"）
	 * @param slippage 滑点设置（默认为0）
	 * @return CtxHandler 策略上下文句柄
	 */
	EXPORT_FLAG	CtxHandler	init_sel_mocker(const char* name, WtUInt32 date, WtUInt32 time, const char* period, const char* trdtpl = "CHINA", const char* session = "TRADING", int slippage = 0);

	/**
	 * @brief 运行回测
	 * @details 开始执行回测，可选择是否输出结果和异步执行
	 * @param bNeedDump 是否需要输出回测结果
	 * @param bAsync 是否异步执行
	 */
	EXPORT_FLAG	void		run_backtest(bool bNeedDump, bool bAsync);

	/**
	 * @brief 写入日志
	 * @details 向系统日志写入指定级别的日志信息
	 * @param level 日志级别
	 * @param message 日志消息
	 * @param catName 日志分类名称
	 */
	EXPORT_FLAG	void		write_log(WtUInt32 level, const char* message, const char* catName);

	/**
	 * @brief 获取版本信息
	 * @details 获取WonderTrader回测系统的版本信息
	 * @return WtString 版本信息字符串
	 */
	EXPORT_FLAG	WtString	get_version();

	/**
	 * @brief 释放回测资源
	 * @details 释放回测系统占用的所有资源
	 */
	EXPORT_FLAG	void		release_backtest();

	/**
	 * @brief 清理缓存
	 * @details 清理回测系统的缓存数据
	 */
	EXPORT_FLAG	void		clear_cache();

	/**
	 * @brief 停止回测
	 * @details 停止正在运行的回测
	 */
	EXPORT_FLAG	void		stop_backtest();


	//////////////////////////////////////////////////////////////////////////
	//CTA策略接口
#pragma region "CTA接口"
	/**
	 * @brief CTA策略开多仓
	 * @details CTA策略执行开多仓操作
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param qty 开仓数量
	 * @param userTag 用户标签
	 * @param limitprice 限价（0表示市价）
	 * @param stopprice 止损价（0表示不设止损）
	 */
	EXPORT_FLAG	void		cta_enter_long(CtxHandler cHandle, const char* stdCode, double qty, const char* userTag, double limitprice, double stopprice);

	/**
	 * @brief CTA策略平多仓
	 * @details CTA策略执行平多仓操作
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param qty 平仓数量
	 * @param userTag 用户标签
	 * @param limitprice 限价（0表示市价）
	 * @param stopprice 止损价（0表示不设止损）
	 */
	EXPORT_FLAG	void		cta_exit_long(CtxHandler cHandle, const char* stdCode, double qty, const char* userTag, double limitprice, double stopprice);

	/**
	 * @brief CTA策略开空仓
	 * @details CTA策略执行开空仓操作
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param qty 开仓数量
	 * @param userTag 用户标签
	 * @param limitprice 限价（0表示市价）
	 * @param stopprice 止损价（0表示不设止损）
	 */
	EXPORT_FLAG	void		cta_enter_short(CtxHandler cHandle, const char* stdCode, double qty, const char* userTag, double limitprice, double stopprice);

	/**
	 * @brief CTA策略平空仓
	 * @details CTA策略执行平空仓操作
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param qty 平仓数量
	 * @param userTag 用户标签
	 * @param limitprice 限价（0表示市价）
	 * @param stopprice 止损价（0表示不设止损）
	 */
	EXPORT_FLAG	void		cta_exit_short(CtxHandler cHandle, const char* stdCode, double qty, const char* userTag, double limitprice, double stopprice);

	/**
	 * @brief CTA策略获取持仓盈亏
	 * @details CTA策略获取指定合约的持仓盈亏
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @return double 持仓盈亏
	 */
	EXPORT_FLAG	double		cta_get_position_profit(CtxHandler cHandle, const char* stdCode);

	/**
	 * @brief CTA策略获取明细进场时间
	 * @details CTA策略获取指定合约明细的进场时间
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param openTag 开仓标签
	 * @return WtUInt64 进场时间戳
	 */
	EXPORT_FLAG	WtUInt64	cta_get_detail_entertime(CtxHandler cHandle, const char* stdCode, const char* openTag);

	/**
	 * @brief CTA策略获取明细成本
	 * @details CTA策略获取指定合约明细的开仓成本
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param openTag 开仓标签
	 * @return double 开仓成本
	 */
	EXPORT_FLAG	double		cta_get_detail_cost(CtxHandler cHandle, const char* stdCode, const char* openTag);

	/**
	 * @brief CTA策略获取明细盈亏
	 * @details CTA策略获取指定合约明细的盈亏
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param openTag 开仓标签
	 * @param flag 盈亏标志
	 * @return double 明细盈亏
	 */
	EXPORT_FLAG	double		cta_get_detail_profit(CtxHandler cHandle, const char* stdCode, const char* openTag, int flag);

	/**
	 * @brief CTA策略获取持仓均价
	 * @details CTA策略获取指定合约的持仓均价
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @return double 持仓均价
	 */
	EXPORT_FLAG	double		cta_get_position_avgpx(CtxHandler cHandle, const char* stdCode);

	/**
	 * @brief CTA策略获取持仓
	 * @details CTA策略获取指定合约的持仓数量
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param bOnlyValid 是否只获取有效持仓
	 * @param openTag 开仓标签
	 * @return double 持仓数量
	 */
	EXPORT_FLAG	double		cta_get_position(CtxHandler cHandle, const char* stdCode, bool bOnlyValid, const char* openTag);

	/**
	 * @brief CTA策略设置持仓
	 * @details CTA策略直接设置指定合约的持仓数量
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param qty 目标持仓数量
	 * @param uesrTag 用户标签
	 * @param limitprice 限价（0表示市价）
	 * @param stopprice 止损价（0表示不设止损）
	 */
	EXPORT_FLAG	void		cta_set_position(CtxHandler cHandle, const char* stdCode, double qty, const char* uesrTag, double limitprice, double stopprice);

	/**
	 * @brief 获取合约最新价格
	 * @details 获取指定合约的最新价格
	 * @param stdCode 标准合约代码
	 * @return double 最新价格
	 */
	EXPORT_FLAG	double 		cta_get_price(const char* stdCode);

	/**
	 * @brief CTA策略获取资金数据
	 * @details CTA策略获取资金相关数据
	 * @param cHandle 策略上下文句柄
	 * @param flag 数据标志（0-动态权益，1-总平仓盈亏，2-总浮动盈亏，3-总手续费）
	 * @return double 资金数据
	 */
	EXPORT_FLAG	double		cta_get_fund_data(CtxHandler cHandle, int flag);

	/**
	 * @brief 获取当前交易日
	 * @details 获取当前交易日期
	 * @return WtUInt32 交易日期（YYYYMMDD格式）
	 */
	EXPORT_FLAG	WtUInt32 	cta_get_tdate();

	/**
	 * @brief 获取当前日期
	 * @details 获取当前日期
	 * @return WtUInt32 当前日期（YYYYMMDD格式）
	 */
	EXPORT_FLAG	WtUInt32 	cta_get_date();

	/**
	 * @brief 获取当前时间
	 * @details 获取当前时间
	 * @return WtUInt32 当前时间（HHMM格式）
	 */
	EXPORT_FLAG	WtUInt32 	cta_get_time();

	/**
	 * @brief CTA策略获取K线数据
	 * @details CTA策略获取指定合约的K线数据
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param period K线周期
	 * @param barCnt K线条数
	 * @param isMain 是否主K线
	 * @param cb K线数据回调函数
	 * @return WtUInt32 实际获取的K线条数
	 */
	EXPORT_FLAG	WtUInt32	cta_get_bars(CtxHandler cHandle, const char* stdCode, const char* period, WtUInt32 barCnt, bool isMain, FuncGetBarsCallback cb);

	/**
	 * @brief CTA策略获取tick数据
	 * @details CTA策略获取指定合约的tick数据
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param tickCnt tick数据条数
	 * @param cb tick数据回调函数
	 * @return WtUInt32 实际获取的tick条数
	 */
	EXPORT_FLAG	WtUInt32	cta_get_ticks(CtxHandler cHandle, const char* stdCode, WtUInt32 tickCnt, FuncGetTicksCallback cb);

	/**
	 * @brief CTA策略获取所有持仓
	 * @details CTA策略获取所有合约的持仓信息
	 * @param cHandle 策略上下文句柄
	 * @param cb 持仓信息回调函数
	 */
	EXPORT_FLAG void		cta_get_all_position(CtxHandler cHandle, FuncGetPositionCallback cb);

	/**
	 * @brief CTA策略获取首次进场时间
	 * @details CTA策略获取指定合约的首次进场时间
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @return WtUInt64 首次进场时间戳
	 */
	EXPORT_FLAG	WtUInt64	cta_get_first_entertime(CtxHandler cHandle, const char* stdCode);

	/**
	 * @brief CTA策略获取最后进场时间
	 * @details CTA策略获取指定合约的最后进场时间
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @return WtUInt64 最后进场时间戳
	 */
	EXPORT_FLAG	WtUInt64	cta_get_last_entertime(CtxHandler cHandle, const char* stdCode);

	/**
	 * @brief CTA策略获取最后出场时间
	 * @details CTA策略获取指定合约的最后出场时间
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @return WtUInt64 最后出场时间戳
	 */
	EXPORT_FLAG	WtUInt64	cta_get_last_exittime(CtxHandler cHandle, const char* stdCode);

	/**
	 * @brief CTA策略获取最后进场价格
	 * @details CTA策略获取指定合约的最后进场价格
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @return double 最后进场价格
	 */
	EXPORT_FLAG	double		cta_get_last_enterprice(CtxHandler cHandle, const char* stdCode);

	/**
	 * @brief CTA策略记录日志
	 * @details CTA策略记录自定义日志信息
	 * @param cHandle 策略上下文句柄
	 * @param message 日志消息
	 */
	EXPORT_FLAG	void		cta_log_text(CtxHandler cHandle, const char* message);

	/**
	 * @brief CTA策略保存用户数据
	 * @details CTA策略保存用户自定义数据
	 * @param cHandle 策略上下文句柄
	 * @param key 数据键名
	 * @param val 数据值
	 */
	EXPORT_FLAG	void		cta_save_userdata(CtxHandler cHandle, const char* key, const char* val);

	/**
	 * @brief CTA策略加载用户数据
	 * @details CTA策略加载用户自定义数据
	 * @param cHandle 策略上下文句柄
	 * @param key 数据键名
	 * @param defVal 默认值
	 * @return WtString 数据值
	 */
	EXPORT_FLAG	WtString	cta_load_userdata(CtxHandler cHandle, const char* key, const char* defVal);

	/**
	 * @brief CTA策略订阅tick数据
	 * @details CTA策略订阅指定合约的tick数据
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 */
	EXPORT_FLAG	void		cta_sub_ticks(CtxHandler cHandle, const char* stdCode);

	/**
	 * @brief CTA策略单步执行
	 * @details CTA策略执行单步操作，用于调试
	 * @param cHandle 策略上下文句柄
	 * @return bool 执行是否成功
	 */
	EXPORT_FLAG	bool		cta_step(CtxHandler cHandle);
#pragma endregion "CTA接口"

	//////////////////////////////////////////////////////////////////////////
	//选股策略接口
#pragma  region "SEL接口"
	/**
	 * @brief SEL策略获取持仓
	 * @details SEL策略获取指定合约的持仓数量
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param bOnlyValid 是否只获取有效持仓
	 * @param openTag 开仓标签
	 * @return double 持仓数量
	 */
	EXPORT_FLAG	double		sel_get_position(CtxHandler cHandle, const char* stdCode, bool bOnlyValid, const char* openTag);

	/**
	 * @brief SEL策略设置持仓
	 * @details SEL策略设置指定合约的持仓数量
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param qty 目标持仓数量
	 * @param uesrTag 用户标签
	 */
	EXPORT_FLAG	void		sel_set_position(CtxHandler cHandle, const char* stdCode, double qty, const char* uesrTag);

	/**
	 * @brief SEL策略获取合约价格
	 * @details SEL策略获取指定合约的最新价格
	 * @param stdCode 标准合约代码
	 * @return double 最新价格
	 */
	EXPORT_FLAG	double 		sel_get_price(const char* stdCode);

	/**
	 * @brief SEL策略获取当前日期
	 * @details SEL策略获取当前日期
	 * @return WtUInt32 当前日期（YYYYMMDD格式）
	 */
	EXPORT_FLAG	WtUInt32 	sel_get_date();

	/**
	 * @brief SEL策略获取当前时间
	 * @details SEL策略获取当前时间
	 * @return WtUInt32 当前时间（HHMM格式）
	 */
	EXPORT_FLAG	WtUInt32 	sel_get_time();

	/**
	 * @brief SEL策略获取K线数据
	 * @details SEL策略获取指定合约的K线数据
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param period K线周期
	 * @param barCnt K线条数
	 * @param cb K线数据回调函数
	 * @return WtUInt32 实际获取的K线条数
	 */
	EXPORT_FLAG	WtUInt32	sel_get_bars(CtxHandler cHandle, const char* stdCode, const char* period, WtUInt32 barCnt,FuncGetBarsCallback cb);

	/**
	 * @brief SEL策略获取tick数据
	 * @details SEL策略获取指定合约的tick数据
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param tickCnt tick数据条数
	 * @param cb tick数据回调函数
	 * @return WtUInt32 实际获取的tick条数
	 */
	EXPORT_FLAG	WtUInt32	sel_get_ticks(CtxHandler cHandle, const char* stdCode, WtUInt32 tickCnt,FuncGetTicksCallback cb);

	/**
	 * @brief SEL策略获取所有持仓
	 * @details SEL策略获取所有合约的持仓信息
	 * @param cHandle 策略上下文句柄
	 * @param cb 持仓信息回调函数
	 */
	EXPORT_FLAG void		sel_get_all_position(CtxHandler cHandle, FuncGetPositionCallback cb);

	/**
	 * @brief SEL策略记录日志
	 * @details SEL策略记录自定义日志信息
	 * @param cHandle 策略上下文句柄
	 * @param message 日志消息
	 */
	EXPORT_FLAG	void		sel_log_text(CtxHandler cHandle, const char* message);

	/**
	 * @brief SEL策略保存用户数据
	 * @details SEL策略保存用户自定义数据
	 * @param cHandle 策略上下文句柄
	 * @param key 数据键名
	 * @param val 数据值
	 */
	EXPORT_FLAG	void		sel_save_userdata(CtxHandler cHandle, const char* key, const char* val);

	/**
	 * @brief SEL策略加载用户数据
	 * @details SEL策略加载用户自定义数据
	 * @param cHandle 策略上下文句柄
	 * @param key 数据键名
	 * @param defVal 默认值
	 * @return WtString 数据值
	 */
	EXPORT_FLAG	WtString	sel_load_userdata(CtxHandler cHandle, const char* key, const char* defVal);

	/**
	 * @brief SEL策略订阅tick数据
	 * @details SEL策略订阅指定合约的tick数据
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 */
	EXPORT_FLAG	void		sel_sub_ticks(CtxHandler cHandle, const char* stdCode);
#pragma endregion "SEL接口"

	//////////////////////////////////////////////////////////////////////////
//HFT策略接口
#pragma  region "HFT接口"

	/**
	 * @brief HFT策略获取持仓
	 * @details HFT策略获取指定合约的持仓数量
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param bOnlyValid 是否只获取有效持仓
	 * @return double 持仓数量
	 */
	EXPORT_FLAG	double		hft_get_position(CtxHandler cHandle, const char* stdCode, bool bOnlyValid);

	/**
	 * @brief HFT策略获取持仓盈亏
	 * @details HFT策略获取指定合约的持仓盈亏
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @return double 持仓盈亏
	 */
	EXPORT_FLAG	double		hft_get_position_profit(CtxHandler cHandle, const char* stdCode);

	/**
	 * @brief HFT策略获取未完成交易
	 * @details HFT策略获取指定合约的未完成交易数量
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @return double 未完成交易数量
	 */
	EXPORT_FLAG	double		hft_get_undone(CtxHandler cHandle, const char* stdCode);

	/**
	 * @brief HFT策略获取合约价格
	 * @details HFT策略获取指定合约的最新价格
	 * @param stdCode 标准合约代码
	 * @return double 最新价格
	 */
	EXPORT_FLAG	double 		hft_get_price(const char* stdCode);

	/**
	 * @brief HFT策略获取当前日期
	 * @details HFT策略获取当前日期
	 * @return WtUInt32 当前日期（YYYYMMDD格式）
	 */
	EXPORT_FLAG	WtUInt32 	hft_get_date();

	/**
	 * @brief HFT策略获取当前时间
	 * @details HFT策略获取当前时间
	 * @return WtUInt32 当前时间（HHMM格式）
	 */
	EXPORT_FLAG	WtUInt32 	hft_get_time();

	/**
	 * @brief HFT策略获取秒数
	 * @details HFT策略获取秒数
	 * @return WtUInt32 秒数
	 */
	EXPORT_FLAG	WtUInt32 	hft_get_secs();

	/**
	 * @brief HFT策略获取K线数据
	 * @details HFT策略获取指定合约的K线数据
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param period K线周期
	 * @param barCnt K线条数
	 * @param cb K线数据回调函数
	 * @return WtUInt32 实际获取的K线条数
	 */
	EXPORT_FLAG	WtUInt32	hft_get_bars(CtxHandler cHandle, const char* stdCode, const char* period, WtUInt32 barCnt, FuncGetBarsCallback cb);

	/**
	 * @brief HFT策略获取tick数据
	 * @details HFT策略获取指定合约的tick数据
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param tickCnt tick数据条数
	 * @param cb tick数据回调函数
	 * @return WtUInt32 实际获取的tick条数
	 */
	EXPORT_FLAG	WtUInt32	hft_get_ticks(CtxHandler cHandle, const char* stdCode, WtUInt32 tickCnt, FuncGetTicksCallback cb);

	/**
	 * @brief HFT策略获取订单队列
	 * @details HFT策略获取指定合约的订单队列
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param tickCnt 数据条数
	 * @param cb 订单队列回调函数
	 * @return WtUInt32 实际获取的数据条数
	 */
	EXPORT_FLAG	WtUInt32	hft_get_ordque(CtxHandler cHandle, const char* stdCode, WtUInt32 tickCnt, FuncGetOrdQueCallback cb);

	/**
	 * @brief HFT策略获取订单明细
	 * @details HFT策略获取指定合约的订单明细
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param tickCnt 数据条数
	 * @param cb 订单明细回调函数
	 * @return WtUInt32 实际获取的数据条数
	 */
	EXPORT_FLAG	WtUInt32	hft_get_orddtl(CtxHandler cHandle, const char* stdCode, WtUInt32 tickCnt, FuncGetOrdDtlCallback cb);

	/**
	 * @brief HFT策略获取逐笔成交
	 * @details HFT策略获取指定合约的逐笔成交
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param tickCnt 数据条数
	 * @param cb 逐笔成交回调函数
	 * @return WtUInt32 实际获取的数据条数
	 */
	EXPORT_FLAG	WtUInt32	hft_get_trans(CtxHandler cHandle, const char* stdCode, WtUInt32 tickCnt, FuncGetTransCallback cb);

	/**
	 * @brief HFT策略记录日志
	 * @details HFT策略记录自定义日志信息
	 * @param cHandle 策略上下文句柄
	 * @param message 日志消息
	 */
	EXPORT_FLAG	void		hft_log_text(CtxHandler cHandle, const char* message);

	/**
	 * @brief HFT策略订阅tick数据
	 * @details HFT策略订阅指定合约的tick数据
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 */
	EXPORT_FLAG	void		hft_sub_ticks(CtxHandler cHandle, const char* stdCode);

	/**
	 * @brief HFT策略订阅订单队列
	 * @details HFT策略订阅指定合约的订单队列
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 */
	EXPORT_FLAG	void		hft_sub_order_queue(CtxHandler cHandle, const char* stdCode);

	/**
	 * @brief HFT策略订阅订单明细
	 * @details HFT策略订阅指定合约的订单明细
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 */
	EXPORT_FLAG	void		hft_sub_order_detail(CtxHandler cHandle, const char* stdCode);

	/**
	 * @brief HFT策略订阅逐笔成交
	 * @details HFT策略订阅指定合约的逐笔成交
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 */
	EXPORT_FLAG	void		hft_sub_transaction(CtxHandler cHandle, const char* stdCode);

	/**
	 * @brief HFT策略取消交易
	 * @details HFT策略取消指定的交易订单
	 * @param cHandle 策略上下文句柄
	 * @param localid 本地订单ID
	 * @return bool 取消是否成功
	 */
	EXPORT_FLAG	bool		hft_cancel(CtxHandler cHandle, WtUInt32 localid);

	/**
	 * @brief HFT策略取消所有交易
	 * @details HFT策略取消指定合约的所有交易订单
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param isBuy 是否为买单
	 * @return WtString 取消的订单ID列表
	 */
	EXPORT_FLAG	WtString	hft_cancel_all(CtxHandler cHandle, const char* stdCode, bool isBuy);

	/**
	 * @brief HFT策略买入交易
	 * @details HFT策略执行买入交易
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param price 价格
	 * @param qty 数量
	 * @param userTag 用户标签
	 * @param flag 交易标志
	 * @return WtString 订单ID列表
	 */
	EXPORT_FLAG	WtString	hft_buy(CtxHandler cHandle, const char* stdCode, double price, double qty, const char* userTag, int flag);

	/**
	 * @brief HFT策略卖出交易
	 * @details HFT策略执行卖出交易
	 * @param cHandle 策略上下文句柄
	 * @param stdCode 标准合约代码
	 * @param price 价格
	 * @param qty 数量
	 * @param userTag 用户标签
	 * @param flag 交易标志
	 * @return WtString 订单ID列表
	 */
	EXPORT_FLAG	WtString	hft_sell(CtxHandler cHandle, const char* stdCode, double price, double qty, const char* userTag, int flag);

	/**
	 * @brief HFT策略保存用户数据
	 * @details HFT策略保存用户自定义数据
	 * @param cHandle 策略上下文句柄
	 * @param key 数据键名
	 * @param val 数据值
	 */
	EXPORT_FLAG	void		hft_save_userdata(CtxHandler cHandle, const char* key, const char* val);

	/**
	 * @brief HFT策略加载用户数据
	 * @details HFT策略加载用户自定义数据
	 * @param cHandle 策略上下文句柄
	 * @param key 数据键名
	 * @param defVal 默认值
	 * @return WtString 数据值
	 */
	EXPORT_FLAG	WtString	hft_load_userdata(CtxHandler cHandle, const char* key, const char* defVal);

	/**
	 * @brief HFT策略单步执行
	 * @details HFT策略执行单步操作，用于调试
	 * @param cHandle 策略上下文句柄
	 */
	EXPORT_FLAG	void		hft_step(CtxHandler cHandle);
#pragma endregion "HFT接口"
#ifdef __cplusplus
}
#endif